--测试
print("Hello World!");

--#region 基础语法
print('')
print('----基础语法----')
b = 10  --创建全局变量
local a = 9  --创建本地变量
print(b)  --10
print(a)  --9
b = nil --删除变量
a = nil --删除变量
print(b)  --nil
print(a)  --nil

print('单行注释 --')
print('多行注释 [[注释内容]]')
--#ednregion

--#region 数据类型
print('')
print('----数据类型----')

--boolean flase || true
--number 双精度浮点数
--string 双引号或者单引号内的字符
--userdata  表示任意存储在变量中的C数据结构
--table  表示一个关联数组，也称哈希表或字典,数组的索引可以是数字、字符串、或表类型。可通过{}创建一个空表
--function 由C或者Lua编写的函数
--thread  表示一个执行的独立线程，用于执行协同程序

print('')
print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string
--#endregion

--#region 数据使用注意事项
print('')
print('----数据类型使用注意事项----')

print('----nil----')
a = nil --nil  表示一个无效值，可以删除对象，在条件表达式中==false
if nil then
    print("条件为真")
else
   print("条件为假")        
end
type(x)   --type(x) => "nil" , nil作比较判断时需要加上“”
print(type(x))
print(type(x) == nil)
print(type(x) == "nil")
print()
print('----boolean----')
type(true)  --Boolean True||False Lua把flase和nil看作false 其他都为true，数字 0也是true

if 0 then
    print("数字0是 true")
end

print('----number----')
print('Lua默认只有一种number(数字)类型 --double(双精度)类型')

print('----string----')
print('Lua可以使用单引号或者双引号创建字符串，但必须使用相同的引号创建字符串，也可以使用[[字符串]]创建字符串')
html = [[
<html>
<head></head>
<body>
    <a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)
print('字符串的连接不能使用运算符 +，Lua在处理运算时会尽量将字符串转换为数字，所以使用 .. 连接字符串')
print("7" + '8')
print("2e2" + '1')
print("errorCode:" .. '2')
print(1234 .. 5678)
s = '#号放在字符串的开头表示字符串长度'
lenth = #s
print('string[' .. s .. ']的长度是' .. lenth)

print()
print('----table----')
local tbl1 = {}  -- 创建一个空的Table
print(tbl1.key)
print(tbl1[1])
local tbl2 = {key1 = "value1", key2 = "value2"}  -- 创建一个包含两个元素的Table
print(tbl2[1])  --看作一个字典 key1-value1 ，无法使用下标获取值
print(tbl2.key1)
for key, value in pairs(tbl2) do
    print(key, value)
end

-- 创建一个数组
local myArray = {10, 20, 30, 40, 50}   --看作一个数组，可以使用下标访问

-- 访问数组元素
print(myArray[1])  -- 输出 10
print(myArray[3])  -- 输出 30

for i = 1, 5 do
    print('下标'.. i ,myArray[i])
end

lenth = #myArray
print("myArray数组的长度是" .. lenth)

myArray[6] = 99;    --tavle 长度并不固定，有新数据时自动增长，删除数据自动移除
for i = 1, 6 do
    print('下标'.. i ,myArray[i])
end

lenth = #myArray
print("myArray数组的长度是" .. lenth)

table.remove (myArray,3)   --通过下标移除第三个元素
for i = 1, 5 do
    print('下标'.. i ,myArray[i])
end

lenth = #myArray
print("myArray数组的长度是" .. lenth)

print('')
print('----function----')   --函数可以存在变量里
function  factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n-1)
    end
end

print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

function testFun(tab,fun)
    for key, value in pairs(tab) do
        print(fun(key,value));
    end
end
--可以以匿名函数为参数传递function
tab={key1="val1",key2="val2"};

testFun(tab,
function(key,val)
    return key .. "==" .. val;
end
);


--#endregion

--#region 线程 thread
print('')
print('----线程----')
threadStr = [[在 Lua 里，最主要的线程是协同程序（coroutine）。
它跟线程（thread）差不多，拥有自己独立的栈、局部变量和指令指针，可以跟其他协同程序共享全局变量和其他大部分东西。
线程跟协程的区别：线程可以同时多个运行，而协程任意时刻只能运行一个，并且处于运行状态的协程只有被挂起（suspend）时才会暂停。]]

print(threadStr)
--#endregion

--#region userdata
print('')
print('----userdata----')
print('userdata 是一个C数据结构，它允许程序员在Lua中创建自定义数据类型。')
print('userdata 是一个指针，指向一个C数据结构。')
print('userdata 可以被用来封装C数据结构，或者用来封装C函数。')
--#endregion